package com.banyuan.lesson.polymorphism;

/*
 * 多态
 * 编译期多态-方法的重载
 * 运行期多态-方法的重写
 *
 * 实现步骤
 * 1、继承关系；
 * 2、方法的重写（覆盖），Override；
 * 3、父类的引用指向子类对象；
 *
 * 方法的重写
 * 1、子类对象和父类对象的关系（静态方法不会被重写）；
 * 2、大部分情况下，子类方法和父类方法一摸一样；
 * 3、子类的方法的访问修饰符必须大于等于父类；
 * 4、大部分情况下返回值一样，对于引用类型，子类的方法的返回值可以是父类的方法的返回值的子类；
 * 5、子类不能抛出父类没有抛出非运行时的异常；
 * */
public class Define {
    public static void main(String[] args) {
        Animal dog = new Dog();
        Animal cat = new Cat();
        dog.run();


//        dog.ww();
        //编译器调用的是Animal的方法
//        运行时调用的实际指向的对象的方法


        Dog dog2 = (Dog) dog;
        dog2.ww();

        //加一个判断语句，防止强转之后运行时类型异常；
        //instance of可以让类型异常在编译时避免，一般这个异常都是在运行时出现编译不报错；
        //慎用instance of，可能会导致功能的丢失；
        if(cat instanceof Dog){
            Dog dog3 = (Dog) cat;
        }
    }
}
